什么是内部类?内部类的作用

在java语言中,可以把一个类定义到另外一个类的内部,在类里面的这个类就叫内部类,外面的类就叫外部类。
在这情况下,这个内部类可以看做外部类的一个成员。
内部类好处
1.隐藏你不想让别人知道的操作,也即封装性。

public interface Contents {
	int value();
}
 
public interface Destination {
	String readLabel();
}
 
public class Goods {
	private class Content implements Contents {
		private int i = 11;
 
		public int value() {
			return i;
		}
	}
 
	protected class GDestination implements Destination {
		private String label;
 
		private GDestination(String whereTo) {
			label = whereTo;
		}
 
		public String readLabel() {
			return label;
		}
	}
 
	public Destination dest(String s) {
		return new GDestination(s);
	}
 
	public Contents cont() {
		return new Content();
	}
}
 
class TestGoods {
	public static void main(String[] args) {
		Goods p = new Goods();
		Contents c = p.cont();
		Destination d = p.dest("Beijing");
	}
}

在这个例子里类Content和GDestination被定义在了类Goods内部,并且分别有着protected和private修饰符来控制访问级别。在后面的main方法里,直接用 Contents c和Destination d进行操作,你甚至连这两个内部类的名字都没有看见!这样,内部类的第一个好处就体现出来了 隐藏你不想让别人知道的操作,也即封装性。同时,我们也发现了在外部类作用范围之外得到内部类对象的第一个方法,那就是利用其外部类的方法创建并返回。

2.一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!

public class Goods {
	private valueRate = 2;
 
	private class Content implements Contents {
		private int i = 11 * valueRate;
 
		public int value() {
			return i;
		}
	}
 
	protected class GDestination implements Destination {
		private String label;
 
		private GDestination(String whereTo) {
			label = whereTo;
		}
 
		public String readLabel() {
			return label;
		}
	}
 
	public Destination dest(String s) {
		return new GDestination(s);
	}
 
	public Contents cont() {
		return new Content();
	}
}

在这里我们给Goods类增加了一个private成员变量valueRate,意义是货物的价值系数,在内部类Content的方法value()计算价值时把它乘上。
我们发现,value()可以访问valueRate,这也是内部类的第二个好处 一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!
这是一个非常有用的特性,为我们在设计时提供了更多的思路和捷径。要想实现这个功能,内部类对象就必须有指向外部类对象的引用。

内部类可以分为多种;主要以下4种:静态内部类,成员内部类,局部内部类,匿名内部类

  1. 静态内部类
    静态内部类是指被声明为static的内部类,他可以不依赖内部类而实例,而通常的内部类需要实例化外部类,从而实例化。静态内部类不可以有与外部类有相同的类名。不能访问外部类的普通成员变量,但是可以访问静态成员变量和静态方法(包括私有类型)

  2. 成员内部类
    一个 静态内部类去掉static 就是成员内部类,他可以自由的引用外部类的属性和方法,无论是静态还是非静态。但是不可以有静态属性和方法

  3. 局部内部类
    定义在一个代码块的内类,他的作用范围是所在代码块,是内部类中最少使用的一类型。局部内部类跟局部变量一样,不能被public ,protected,private以及static修饰,只能访问方法中定义final类型的局部变量

  4. 匿名内部类
    匿名内部类是一种没有类名的内部类,不使用class,extends,implements,没有构造函数,他必须继承其他类或实现其他接口。匿名内部类的好处是使代码更加简洁,紧凑,但是带来的问题是易读性下降。

内部类的使用时机

1、实现事件监听器的时候(比方说actionListener 。。。采用内部类很容易实现);

2、编写事件驱动时(内部类的对象可以访问外部类的成员方法和变量,注意包括私有成员);

3、在能实现功能的情况下,为了节省编译后产生的字节码(内部类可以减少字节码文件,即java文件编译后的.class文件);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值